/* Standard includes. */
#include <stdio.h>

/* Kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"
#include "xiot.h"

#include "util.h"

/*debug printf*/
#define TAG_XIOTTEST                        "XIOTTEST"

#define DebugPrint_XoitTest(fmt,...)        printWithTimestamp(TAG_XIOTTEST,DEBUG_LEVEL_INFO, fmt, ##__VA_ARGS__) // 带时间戳
#define DebugPrint_XoitTest_DEG(fmt,...)    printWithTimestamp(TAG_XIOTTEST,DEBUG_LEVEL_DEBUG, fmt, ##__VA_ARGS__) // 带时间戳

// 定义事件组的事件位
#define EVENT_BIT_CONNECTED         (1 << 0)
#define EVENT_BIT_SEND_SUCCESS      (1 << 1)
#define EVENT_BIT_RECEIVE_TIMEOUT   (1 << 2)

EventGroupHandle_t xEventGroup = NULL;

// 用户回调函数，用于接收消息并设置事件组
void vUserEventHook(XiotEvent* event, XiotReport* report) {
    // 根据报告类型设置事件组的相应位
	DebugPrint_XoitTest("xiotMsgType: %d", report->xiotMsgType);
    switch(report->xiotMsgType) {
        case XIOT_MSG_CONNECTED:
            xEventGroupSetBits(xEventGroup, EVENT_BIT_CONNECTED);
            break;
        case XIOT_MSG_SEND_SUCCESS:
            xEventGroupSetBits(xEventGroup, EVENT_BIT_SEND_SUCCESS);
            break;
        case XIOT_MSG_RECEIVE_TIMEOUT:
            xEventGroupSetBits(xEventGroup, EVENT_BIT_RECEIVE_TIMEOUT);
            break;
        // 处理其他消息类型...
		default:
            break;
    }
}

// 测试任务
void vTestXiotTask(void *pvParameters) {
    // 获取事件组
    if (xEventGroup == NULL) {
        // 事件组创建失败处理
        while(1) {}
    }

    // 初始化 XIOT 模块
    xiot.Init();
    
    // 设置用户回调函数
    xiot.userEventHook = vUserEventHook;

    // 测试连接事件
    xiot.Handle(XIOT_EVENT_CONNECT, NULL);

    // 等待连接成功事件
    EventBits_t uxBits = xEventGroupWaitBits(
        xEventGroup,
        EVENT_BIT_CONNECTED,
        pdTRUE, // 清除事件位
        pdFALSE, // 等待所有事件位
        portMAX_DELAY);

    if (uxBits & EVENT_BIT_CONNECTED) {
        // 处理连接成功事件
    	DebugPrint_XoitTest("EVENT_BIT_CONNECTED");
    }

    // 测试发送事件
    xiot.Handle(XIOT_EVENT_SEND, NULL);

    // 等待发送成功事件
    uxBits = xEventGroupWaitBits(
        xEventGroup,
        EVENT_BIT_SEND_SUCCESS,
        pdTRUE, // 清除事件位
        pdFALSE, // 等待所有事件位
        portMAX_DELAY);

    if (uxBits & EVENT_BIT_SEND_SUCCESS) {
        // 处理发送成功事件
    	DebugPrint_XoitTest("EVENT_BIT_SEND_SUCCESS");
    }

    // 测试接收超时事件
    // 假设 XIOT_EVENT_SEND 后会自动触发 XIOT_EVENT_RECEIVE_TIMEOUT
    uxBits = xEventGroupWaitBits(
        xEventGroup,
        EVENT_BIT_RECEIVE_TIMEOUT,
        pdTRUE, // 清除事件位
        pdFALSE, // 等待所有事件位
        portMAX_DELAY);

    if (uxBits & EVENT_BIT_RECEIVE_TIMEOUT) {
    	DebugPrint_XoitTest("Receive timeout");
        // 处理接收超时事件
    }

    // 测试结束
    DebugPrint_XoitTest("XIOT test completed successfully.\n");

    // 清理资源
    vEventGroupDelete(xEventGroup);
    xiot.Deinit();
    vTaskDelete(NULL);
}

int xiot_test(void) {
    // 初始化 FreeRTOS 系统
    // ...

    xEventGroup = xEventGroupCreate();

    // 创建测试任务
    xTaskCreate(vTestXiotTask, "TestXiot", configMINIMAL_STACK_SIZE * 2, NULL, 2, NULL);

    // 启动调度器
    vTaskStartScheduler();

    // 主循环永远不会返回
    for (;;) {}
}